/**
 ******************************************************************************
 * @file           : bsp_rtc.h
 * @brief          : RTC Driver Header File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * RTC驱动程序头文件
 * 提供实时时钟读写、闹钟、日期时间管理等接口
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_RTC_H
#define __BSP_RTC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <time.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief RTC错误码枚举
 */
typedef enum
{
    RTC_OK = 0,                 /*!< 成功 */
    RTC_ERROR_PARAM,            /*!< 参数错误 */
    RTC_ERROR_HAL               /*!< HAL库错误 */
} RTC_Error_e;

/**
 * @brief RTC日期时间结构体
 */
typedef struct
{
    uint16_t year;              /*!< 年(2000-2099) */
    uint8_t month;              /*!< 月(1-12) */
    uint8_t day;                /*!< 日(1-31) */
    uint8_t hour;               /*!< 时(0-23) */
    uint8_t minute;             /*!< 分(0-59) */
    uint8_t second;             /*!< 秒(0-59) */
    uint8_t week;               /*!< 星期(1-7, 1=周一) */
} RTC_DateTime_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void rtc_init(void);                                                            /* RTC初始化 */
void rtc_deinit(void);                                                          /* RTC反初始化 */

/* 日期时间设置函数 */
RTC_Error_e rtc_set_datetime(const RTC_DateTime_t *datetime);                  /* 设置日期时间 */
RTC_Error_e rtc_set_time(uint8_t hour, uint8_t minute, uint8_t second);        /* 设置时间 */
RTC_Error_e rtc_set_date(uint16_t year, uint8_t month, uint8_t day);           /* 设置日期 */

/* 日期时间读取函数 */
RTC_Error_e rtc_get_datetime(RTC_DateTime_t *datetime);                        /* 获取日期时间 */
RTC_Error_e rtc_get_time(uint8_t *hour, uint8_t *minute, uint8_t *second);     /* 获取时间 */
RTC_Error_e rtc_get_date(uint16_t *year, uint8_t *month, uint8_t *day);        /* 获取日期 */

/* 时间戳函数 */
uint32_t rtc_get_timestamp(void);                                               /* 获取时间戳 */
RTC_Error_e rtc_set_timestamp(uint32_t timestamp);                              /* 设置时间戳 */

/* 工具函数 */
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day);               /* 计算星期 */
uint8_t rtc_is_leap_year(uint16_t year);                                        /* 判断闰年 */
void rtc_print_datetime(void);                                                  /* 打印日期时间 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_RTC_H */
